package com.wdemo.repository.impl;

import com.wdemo.contants.RedisContant;
import com.wdemo.repository.FileRepository;
import com.wdemo.utils.AliyunOSSOperator;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Objects;

/**
 * @ClassName LocalPdfFileRepository
 * @Description Pdf文件保存
 * @Author WDEMO
 * @Date 2025/9/2 21:59
 */

@Slf4j
@Component
@RequiredArgsConstructor
public class LocalPdfFileRepository implements FileRepository {

    private final RedisTemplate redisTemplate;

    private final AliyunOSSOperator aliyunOSSOperator;
    @Override
    public boolean save(String chatId, Resource resource) throws IOException {
        // 1. 保存文件到本地磁盘
        String filename = resource.getFilename();
        File target = new File(Objects.requireNonNull(filename));

        // 避免重复保存已存在的文件
        if (!target.exists()) {
            try {
                Path path=target.toPath();
                Files.copy(resource.getInputStream(), target.toPath());
            } catch (IOException e) {
                log.error("PDF文件保存失败", e);
                return false;
            }
        }

        redisTemplate.opsForHash().put(RedisContant.RedisKey.CHAT_PDF, chatId,filename);
        return true;
    }

    @Override
    public String saveByAliyun(String chatId, MultipartFile file)  {
        String path=null;

        try {
            path = aliyunOSSOperator.upload(file.getBytes(), file.getOriginalFilename());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        redisTemplate.opsForHash().put(RedisContant.RedisKey.CHAT_PDF, chatId, path);

        return path;
    }

    @Override
    public Resource getFile(String chatId) {
//        try {
//            // 从Redis获取数据
//            Object fileData = redisTemplate.opsForHash().get(RedisContant.RedisKey.CHAT_PDF, chatId);
//
//            if (fileData == null) {
//                return null;
//            }
//
//            // 处理可能的不同数据类型
//            byte[] fileContent;
//            if (fileData instanceof byte[]) {
//                fileContent = (byte[]) fileData;
//            } else if (fileData instanceof String) {
//                // 如果是String类型，可能需要特殊处理
//                // 这里简单处理，实际可能需要根据存储方式调整
//                fileContent = ((String) fileData).getBytes();
//            } else {
//                log.warn("Unexpected data type from Redis: {}", fileData.getClass());
//                return null;
//            }
//
//            // 返回ByteArrayResource
//            return new ByteArrayResource(fileContent);
//        } catch (Exception e) {
//            log.error("获取文件失败: {}", chatId, e);
//            return null;
//        }
        Object fileData = redisTemplate.opsForHash().get(RedisContant.RedisKey.CHAT_PDF, chatId);
        if (fileData == null) {
            return null;
        }

        return new FileSystemResource(fileData.toString());
    }

    @Override
    public Resource getFileByAliyun(String chatId) {
        Object object = redisTemplate.opsForHash().get(RedisContant.RedisKey.CHAT_PDF, chatId);
        if (object == null) {
            return null;
        }
        String path = (String) object;
        return aliyunOSSOperator.downloadAsResource(path);
    }

    @Override
    public byte[] getFileBytes(String chatId) {
        // 从Redis获取数据
        Object fileData = redisTemplate.opsForHash().get(RedisContant.RedisKey.CHAT_PDF, chatId);

        if (fileData == null) {
            return null;
        }
        // 处理可能的不同数据类型
        byte[] fileContent;
        if (fileData instanceof byte[]) {
            fileContent = (byte[]) fileData;
        } else if (fileData instanceof String) {
            // 如果是String类型，可能需要特殊处理
            // 这里简单处理，实际可能需要根据存储方式调整
            fileContent = ((String) fileData).getBytes();
        } else {
            log.warn("Unexpected data type from Redis: {}", fileData.getClass());
            return null;
        }
        return fileContent;
    }
}
